

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include <unistd.h>

#include "msg.h"

#define MSG_HEAD "Linuxer@gino"

static unsigned char check_msg(char *buff, size_t len)
{
    int i = 0;
    unsigned char sum = 0;

    for (; i < len; ++i)
    {
        sum += buff[i];
    }

    sum = ~sum + 1;
    return sum;
}

int write_msg(int sockfd, char *buff, size_t len)
{

    Msg msg;
    memset(&msg, 0, sizeof(Msg));

    strncpy(msg.msg_head, MSG_HEAD, strlen(MSG_HEAD));
    strncpy(msg.data, buff, len);
    msg.check_sum = check_msg(buff, len);

    int res;
    if ((res = write(sockfd, &msg, sizeof(Msg))) < 0)
    {
        perror("write error: ");
    }

    return res;
}

int read_msg(int sockfd, char *buff, size_t len)
{
    assert(buff != NULL);

    Msg msg;
    memset(&msg, 0, sizeof(Msg));

    int res;
    if ((res = read(sockfd, &msg, sizeof(Msg))) < 0)
    {
        perror("read error: ");
        return -1;
    }

    int msg_data_len = strlen(msg.data);

    unsigned char check_sum = check_msg(msg.data, msg_data_len);
    if (check_sum != msg.check_sum)
    {
        fprintf(stderr, "check sum error!\n");
        return -2;
    }

    res = msg_data_len < len ? msg_data_len : len;

    strncpy(buff, msg.data, res);

    return res;
}